#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<signal.h>
#include<assert.h>
using namespace std;


static void PrintPending(const sigset_t& pending)
{
    cout<<"当前进程的pending位图:";
    for(int signo=1;signo<32;signo++)
    {
        if(sigismember(&pending,signo)) cout<<"1";
        else cout<<"0";
    }
    cout<<"\n";

}
static void handler(int signo)
{
    cout<<"对信号："<<signo<<"执行捕捉"<<endl;
}

int main()
{

    //设置2号信号的自定义捕捉
    signal(2,handler);
    //1.屏蔽2号信号
    //1.1定义信号集对象并初始化
    sigset_t set,oset;
    sigemptyset(&set);
    sigemptyset(&oset);
    //1.2将2号信号添加到set
    sigaddset(&set,2);
    //1.3将新的信号屏蔽字设置进程
    sigprocmask(SIG_BLOCK,&set,&oset);

    //2.while获取进程的pending信号集合
    
    int cnt=0;
    while(true)
    {
        
        //2.1获取pending信号集
        sigset_t pending;
        sigemptyset(&pending);
        int n=sigpending(&pending);//输出型参数
        assert(n==0);
        (void)n;
        //2.2打印
        PrintPending(pending);
        sleep(1);

        //2.3解除屏蔽
        if(cnt++==10)
        {
            cout<<"接触2号信号屏蔽"<<endl;
            sigprocmask(SIG_SETMASK,&oset,nullptr);
        }
    }
}

